package chapter_1.tcp_test;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/**
 * @author fulv
 */
public class Utils {

    /**
     * 两字节UTF8编码首个字节的掩码
     * 两字节UTF8编码的格式 110vvvvv 10vvvvvv
     */
    public static final int TWO_UTF8_FIRST_MASK = 0xC0;

    /**
     * 三字节UTF8编码的首个字节的掩码
     * 三字节UTF8编码的格式 1110vvvv 10vvvvvv 10vvvvvv
     */
    public static final int THREE_UTF8_FIRST_MASK = 0xE0;
    /**
     * UTF8编码中多字节编码非首字节的掩码
     * 非首字节的编码格式 10vvvvvv
     */
    public static final int UTF8_OTHER_MASK = 0x80;


    /**
     * 对数组扩容，变为原来的两倍
     * @param array
     * @return
     */
    public static byte[] expandArray(byte[] array){
        byte[] newArray = new byte[array.length*2];
        for(int i=0;i<array.length;i++){
            newArray[i] = array[i];
        }
        return newArray;
    }

    /**
     * 判断接收到的字节数组是否在末尾被截断，传入最后三个字节来判断
     * @param firstByte 最后三个中的第一个
     * @param secondByte 第二个，也就是倒数第二个
     * @param thirdByte 第三个，也就是最后一个字节
     * @return
     * 返回字符被截断的字节数与该字符字节长度之和，3表示两字节字符被截断一个字节，4表示三字节字符被截断一个字节
     * 5表示三字节字符被截断2个字节，如果没有被截断就返回0
     *
     */
    public static int isCutOff(byte firstByte, byte secondByte, byte thirdByte){
            byte[] result = new byte[3];

        /**
         * 先判断三字节字符是否被截断，因为二字节字符被截断可能会覆盖三字节的情况
         */
        //判断是否是三字节字符被截断一个字节
            if((thirdByte & Utils.THREE_UTF8_FIRST_MASK) == Utils.THREE_UTF8_FIRST_MASK){
                return 4;
            }
            //判断是否是三字节字符被截断两个字节
            if((thirdByte & Utils.UTF8_OTHER_MASK) == Utils.UTF8_OTHER_MASK &&
                    (secondByte & Utils.THREE_UTF8_FIRST_MASK) == Utils.THREE_UTF8_FIRST_MASK){
                return 5;
            }

            //判断是否是一个两字节长的字符被截断
            if((thirdByte & Utils.TWO_UTF8_FIRST_MASK) == Utils.TWO_UTF8_FIRST_MASK){
                return 3;
            }
            //没有被截断返回0
            return 0;
    }

    /**
     * 将byte字节数组转换为16进制的字符串
     */
    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        String[] hexArray = new String[bytes.length];
        for(int j = 0; j< bytes.length; j++){
            hexArray[j] = "0x" + hexChars[j*2] + hexChars[j*2+1];
        }
        return Arrays.toString(hexArray);
    }


    public static void main(String[] args) throws UnsupportedEncodingException {

        //汉字"吕"的utf8编码为{0xe5,0x90,0x95}
        byte[] byteArray = new byte[]{(byte) 0xe5,(byte) 0x90,(byte) 0x95};
        System.out.println(new String(byteArray));

        //这里第一个字节0x41对应着字符为"A",第二和第三个字节对应着"吕"的第一和第二个字节，所以被截断了
        System.out.println(Utils.isCutOff((byte)0x41,(byte)0xe5,(byte)0x90));

        System.out.println(Utils.isCutOff((byte)0x41,(byte)0x42,(byte)0xe5));

        String testStr = "Hello World! 你好中国!";
        byteArray = testStr.getBytes("UTF-8");
        int size = 20;
        byte[] cutoffByteArray = new byte[size];
        System.arraycopy(byteArray,0,cutoffByteArray,0,size);
        System.out.println(new String(cutoffByteArray));
        System.out.println(bytesToHex(byteArray));
        System.out.println((byte)0x6743);

    }
}
    